上一回我們使用 Pod 將應用程式部屬到 Kubernetes 環境裡,今天會介紹如何透過 Service 元件讓應用程式可以從外部存取。
Service 是 Kubernetes 內部的基礎元件,負責定義如何存取 Pod 規則。不管是內部的溝通,或者是外部的服務暴露,都會使用到 Service 來作為 Pod 的進入點。而根據使用狀況,會使用到不同類型的 Service ,主要有以下三種。
ClusterIP 是 Service 的默認類型,使內部可以訪問該服務,而外部則無法存取。通常會使用在如後端伺服器這種只允許內部存取的應用。

NodePort 是一種對外服務的方式,會在所有節點上開放一個連接埠(預設是30000 ~ 32767),發送到該端口的流量就會被轉發到對應服務。因為需要暴露主機位址才能使用,所以大多只用於測試或是 Demo。

LoadBalancer 會跟外部的 Load Balancer 服務搭配,是雲端上暴露服務的標準方式。在 GKE 上使用會提供一個外部 IP ,透過此 IP 就能將流量轉發到你的服務上。

就來試著建置 Service 元件,我們會建立一個類型為 LoadBalancer 的 Service,就可以透過 IP 存取服務。
進入 Cloud Shell 網站,點擊終端機輸入指令
列出所有的 project ,找到之前所創建專案的 PROJECT_ID
gcloud projects list

PROJECT_ID,開啟專案 Terminal
建置元件的方式一樣透過 yaml 檔來定義。
myservice.yaml 檔案cd ~/k8s-test && touch myservice.yaml

還記得上回 mypod.yaml 檔案裡設置的 Label,根據標籤可將 Pod 做分群管理,Service 如何把流量導入到正確的 Pod 上,就是使用 Label Selector , 根據設定的標籤來尋找到對應的 Pod。

mypod.yaml 檔案裡設置的 Label
可以看到設置了一個Label app=myapp,所以只要在 Service 的 Label Selector 也設定同樣標籤,就能成功將流量轉發到此 Pod 上。
myservice.yaml檔案並貼上以下內容
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
  selector:
    app: myapp
apiVersion
kind
metadata
spec
ports
selector
myservice.yaml建立元件kubectl apply -f myservice.yaml
kubectl get <type>查看 Services 元件。kubectl get svc
(輸出結果)
NAME         TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.3.240.1    <none>        443/TCP        24h
myservice    LoadBalancer   10.3.253.46   <pending>     80:30254/TCP   5s
第一個為 kubernetes 內部的 Service 可以忽略。myservice的EXTERNAL-IP欄位顯示是<pending> ,需要等待大約2-3分鐘才能拿到IP。
kubectl get svc
(輸出結果)
NAME         TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)        AGE
kubernetes   ClusterIP      10.3.240.1    <none>          443/TCP        24h
myservice    LoadBalancer   10.3.253.46   34.150.28.184   80:30254/TCP   2m41s
有了外部IP,就能存取服務了。
http://<EXTERNAL-IP>
看到伺服器回傳訊息,代表可以存取到 Pod 了。

今天學習到了 Kubernetes 基本的網路元件 Service,有興趣的話可以搜尋 Ingress、Service Mesh 等關鍵字,能夠了解到更多 K8s 網路的解決方案。